/**
 * Created by ChenYong on 2017-07-12.
 *
 * 添加角色。
 */

$(function () {
    /** 角色表单的 jQuery 对象 */
    var $roleForm = $("#role_form");
    /** 角色 ID 的 jQuery 对象 */
    var $id = $roleForm.find("input[name='id']");
    /** 多个资源 ID 的 jQuery 对象 */
    var $resourceIds = $roleForm.find("input[name='resourceIds']");
    /** 角色代码的 jQuery 对象 */
    var $roleCode = $roleForm.find("input[name='roleCode']");
    /** 提交按钮的 jQuery 对象 */
    var $submitBtn = $roleForm.find("button[name='submitBtn']");
    /** 角色代码远程正在校验的图标的 jQuery 对象 */
    var $checkIconLoading = $("#check_icon_loading");
    /** 角色代码远程校验通过的图标的 jQuery 对象 */
    var $checkIconSuccess = $("#check_icon_success");
    /** 角色代码远程校验未通过的图标的 jQuery 对象 */
    var $checkIconError = $("#check_icon_error");
    /** 显示校验信息的容器 */
    var $validateContainer = $("#validate_container");
    /** zTree 的 jQuery 对象 */
    var $zTree = $("#zTree");
    /** zTree id */
    var zTreeId = $zTree.attr("id");
    /** 角色代码的初始值 */
    var initRoleCode = $roleCode.val();
    /** zTree 配置 */
    var zTreeSetting = {
        data: {
            simpleData: {
                idKey: "id",
                enable: true,
                pIdKey: "parentId",
                rootPId: 0
            }
        },
        view: {
            selectedMulti: false
        },
        check: {
            enable: true,
            chkStyle: "checkbox",
            chkboxType: {"Y": "ps", "N": "s"}
        },
        callback: {
            onCheck: function (event, treeId, treeNode) {
                findCheckedResourceIds();
            }
        }
    };

    showZTree();

    $.validator.addMethod("checkRoleName", function (value, element) {
        return this.optional(element) || chineseRE.test(value);
    });

    $.validator.addMethod("checkRoleCode", function (value, element) {
        return this.optional(element) || roleRE.test(value);
    });

    $roleForm.validate({
        ignore: [],
        rules: {
            roleName: {
                required: true,
                maxlength: 50,
                checkRoleName: true
            },
            roleCode: {
                required: true,
                maxlength: 50,
                checkRoleCode: true,
                remote: {
                    url: "{0}web/role/check/role_code.json".format(globalBasePath),
                    beforeSend: function () {
                        $checkIconLoading.removeClass("hide");
                        $checkIconSuccess.addClass("hide");
                        $checkIconError.addClass("hide")
                    },
                    dataFilter: function (data, type) {
                        $checkIconLoading.addClass("hide");

                        data = $.parseJSON(data);

                        // 传给服务器的角色代码未存在
                        if ((data.resultCode == 0) || ((data.resultCode == 3110) && (initRoleCode == data.result))) {
                            $checkIconSuccess.removeClass("hide");

                            return true;
                        }

                        $checkIconError.removeClass("hide");

                        // 传给服务器的角色代码已存在
                        return false;
                    },
                    error: function (jqXhr, textStatus, errorThrown) {
                        $checkIconLoading.addClass("hide");
                        $checkIconError.removeClass("hide");

                        $.showAjaxErrorMsg(jqXhr);
                    }
                }
            },
            resourceIds: {
                required: true,
            }
        },
        messages: {
            roleName: {
                required: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>请输入角色名称</span>",
                maxlength: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>角色名称的长度不能大于{0}个字符</span>",
                checkRoleName: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>角色名称由汉字、数字（0-9）、字母（a-z, A-Z）、下划线（_）、斜杠（/）组成</span>"
            },
            roleCode: {
                required: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>请输入角色代码</span>",
                maxlength: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>角色代码的长度不能大于{0}个字符</span>",
                checkRoleCode: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>角色代码由(0-9)、(a-z)、(_)组成，且以(a-z)开头，如：administrator</span>",
                remote: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>角色代码已存在，请重新输入</span>"
            },
            resourceIds: {
                required: "<span class='f-s-12'><i class='iconfont icon-error f-s-12'></i>请选择资源</span>"
            }
        },
        errorContainer: $validateContainer,
        errorLabelContainer: $("ul", $validateContainer),
        wrapper: "li",
        submitHandler: function (form) {
            $submitBtn.html("<i class='ace-icon fa fa-spinner fa-spin bigger-150'></i>正在提交…").attr({"disabled": "disabled"});

            return true;
        }
    });

    /**
     * 显示 ZTree。
     */
    function showZTree() {
        $.myAjax({
            url: "web/role/ztree.json",
            modal: true,
            data: {
                id: $id.val()
            },
            successFn: function (data) {
                // 设置图标皮肤
                $.each(data.results, function (i, e) {
                    // 根资源
                    if (e.data.resourceType == 0) {
                        e.iconSkin = "ztree";

                        // 菜单
                    } else if (e.data.resourceType == 1) {
                        e.iconSkin = "menu";

                        // 按钮
                    } else if (e.data.resourceType == 2) {
                        e.iconSkin = "button";

                        // 数据
                    } else if (e.data.resourceType == 3) {
                        e.iconSkin = "data";
                    }
                });

                // 初始化 zTree
                $.fn.zTree.init($zTree, zTreeSetting, data.results);

                findCheckedResourceIds();
            }
        });
    }

    /**
     * 查找被选中的多个资源 ID。
     */
    function findCheckedResourceIds() {
        // 获取 zTree 对象
        var zTreeObj = $.fn.zTree.getZTreeObj(zTreeId);
        // 获取所有 node
        var nodes = zTreeObj.transformToArray(zTreeObj.getNodes());
        // 多个资源 ID
        var resourceIds = "";

        // 查找被选中的节点
        $.each(nodes, function (i, e) {
            if ((e.id != 1) && e.checked) {
                resourceIds += e.id;
                resourceIds += "|";
            }
        });

        if ($.isBlank(resourceIds)) {
            $resourceIds.val("");
        } else {
            $resourceIds.val(resourceIds.substring(0, (resourceIds.length - 1)));
        }
    }
});